package com.ziytek.web.citizen.model.bean;

import com.ziytek.web.citizen.constant.NumConstant;
import com.ziytek.web.citizen.util.HexUtil;
import lombok.Data;
import lombok.Getter;

/**
 * @author fenghx
 * @version 1.0
 * @className CommandLoadData
 * Description: 充放电控制协议-负载数据
 * @date 2025/3/3 19:34
 */
@Data
public class CommandLoadData {

    @Getter
    public enum CommandFlag {
        /**
         * 充电
         */
        CHARGE(0X00),
        /**
         * 放电
         */
        DISCHARGE(0X01),
        /**
         * 分容灯控显示
         */
        DISPLAY(0X02),
        /**
         * 主动查询数据
         */
        QUERY(0X03),
        /**
         * 设置工程参数
         */
        SET_PROJECT_PARAMETER(0X04);

        private final int value;

        CommandFlag(int i) {
            this.value = i;
        }
    }

    @Getter
    public enum CommandType {
        /**
         * 恒流恒压充电
         */
        CONSTANT_FLOW_CONSTANT_PRESSURE_CHARGE(0X01),
        /**
         * 恒流充电
         */
        CONSTANT_FLOW_CHARGE(0X02),
        /**
         * 恒压充电
         */
        CONSTANT_PRESSURE_CHARGE(0X03),
        /**
         * 恒流放电
         */
        CONSTANT_FLOW_DISCHARGE(0X04),
        /**
         * 恒功率充电
         */
        CONSTANT_POWER_CHARGE(0X05),
        /**
         * 恒功率放电
         */
        CONSTANT_POWER_DISCHARGE(0X06),
        /**
         * 恒阻放电
         */
        CONSTANT_RESISTANCE_DISCHARGE(0X07);

        private final int value;

        CommandType(int i) {
            this.value = i;
        }
    }

    /**
     * 要操作的板子地址(分控板地址) 1字节 按位进行取值，设计最多只有16个板子，共128通道 0XFFFF-操作全部板子
     * 0xFFFF 1111 1111  1111 1111 0x0000 0000 0000 0000 0000
     * 高位  低位 板子地址
     * 0000 0000 0000 0001 第一板子
     * 0000 0000 0000 0010 第二板子
     * 0000 0000 0000 0100 第三板子
     * 0000 0000 0000 1000 第四板子
     * 0000 0000 0001 0000 第五板子
     * 0000 0000 0010 0000 第六板子
     * 0000 0000 0100 0000 第七板子
     * 0000 0000 1000 0000 第八板子
     * 0000 0001 0000 0000 第九板子
     * 0000 0010 0000 0000 第十板子
     * 0000 0100 0000 0000 第十一板子
     * 0000 1000 0000 0000 第十二板子
     * 0001 0000 0000 0000 第十三板子
     * 0010 0000 0000 0000 第十四板子
     * 0100 0000 0000 0000 第十五板子
     * 1000 0000 0000 0000 第十六板子
     * 1111 1111 1111 1111 所有板子
     * 转换为10进制就是 2的(n-1)次方,n-代表板子数 取值范围 1-16
     */
    private Integer controlBoardAddress;

    /**
     * 要操作的板子通道(分控板具体通道) 1字节 按位进行取值，对应位置为1表示该通道启动 0XFF-开启全部通道
     * 0xFF 1111 1111 0x00 0000 0000
     * 高位  低位 启动通道
     * 0000 0001 第一通道
     * 0000 0010 第二通道
     * 0000 0100 第三通道
     * 0000 1000 第四通道
     * 0001 0000 第五通道
     * 0010 0000 第六通道
     * 0100 0000 第七通道
     * 1000 0000 第八通道
     * 1111 1111 所有通道
     * 转换为10进制就是 2的(n-1)次方,n-代表通道数 取值范围 1-8
     */
    private int batteryChannel;

    /**
     * 充放电类型 1字节 0X01-恒流恒压充 0X02-恒流充 0X03-恒压充 0X04-恒流放 0X05-恒功率充 0X06-恒功率放 0X07-恒阻放
     */
    private int commandType;

    /**
     * 充放电的电压上下限(CV) 2字节  0x0000-0xFFFF
     */
    private int voltageUpperLowerLimits;

    /**
     * 充放电的电流上下限(CI) 2字节  0x0000-0xFFFF
     */
    private int currentUpperLowerLimits;

    /**
     * 充放电时间（秒数） 4字节  0x00000000-0xFFFFFFFF
     */
    private int chargeDisTimeSeconds;

    /**
     * 截止电流(EV) 2字节  0x0000-0xFFFF
     */
    private int currentCutoff;

    /**
     * 电压上限 2字节  0x0000-0xFFFF
     */
    private int upperVoltageLimit;

    /**
     * 电压下限 2字节  0x0000-0xFFFF
     */
    private int lowerVoltageLimit;

    /**
     * 电流上限 2字节  0x0000-0xFFFF
     */
    private int upperCurrentLimit;

    /**
     * 电流下限 2字节  0x0000-0xFFFF
     */
    private int lowerCurrentLimit;

//    /**
//     * 消息唯一标识 2字节  0x0000-0xFFFF
//     */
//    private String messageUniqueIdentifier;

    public String getCommand() {
//        return HexUtil.fillZero(String.format("%02x", commandFlag), NumConstant.INT_TWO) +
        return HexUtil.fillZero(Integer.toHexString(controlBoardAddress), NumConstant.INT_FOUR) +
                HexUtil.fillZero(Integer.toHexString(batteryChannel), NumConstant.INT_TWO) +
                HexUtil.fillZero(String.format("%02x", commandType), NumConstant.INT_TWO) +
                HexUtil.fillZero(String.format("%04x", voltageUpperLowerLimits), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%04x", currentUpperLowerLimits), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%08x", chargeDisTimeSeconds), NumConstant.INT_EIGHT) +
                HexUtil.fillZero(String.format("%04x", currentCutoff), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%04x", upperVoltageLimit), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%04x", lowerVoltageLimit), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%04x", upperCurrentLimit), NumConstant.INT_FOUR) +
                HexUtil.fillZero(String.format("%04x", lowerCurrentLimit), NumConstant.INT_FOUR) ;
                //+messageUniqueIdentifier;
    }

}
